1000 ; 1010 ;COMMAND WEDGE 1020 ;BY FRANK E. DIGIOIA 1030 ;11/17/85 1040 ; 1050 * = $C200 1060 ; 1070 INIT LDA #CWEDGE 1100 STA $0309 1110 RTS 1120 ; 1130 CWEDGE = * ;THIS IS THE WEDGE 1140 JSR CHRGET ;GET NEXT BYTE 1150 JSR CHKTOK ;WHAT IS ITPRINT 1160 JMP $A7AE ;INTERPRETER LOOP 1170 ; 1180 REM JMP $A93B ;BASIC REM COMMAND 1190 ; 1200 CHKTOK CMP #$27 ;SINGLE QUOTEPRINT 1210 BEQ REM ;NEW REM COMMAND 1220 TAX ;SET FLAGS 1230 BPL WEXIT ;NOT A TOKEN 1240 ; 1250 LDX #$00 ;USE .X AS INDEX 1260 STA TOKEN ;SAVE FOR COMPARE 1270 TLOOP LDA TOKTAB,X ;BYTE FROM TABLE 1280 BEQ WEXIT ;END OF TABLE 1290 CMP TOKEN ;A MATCHPRINT 1300 BEQ EXEC ;YES/EXECUTE IT 1310 INX ;NO/BUMP INDEX 1320 BNE TLOOP ;KEEP LOOKING 1330 ; 1340 EXEC TXA ;PUT OFFSET IN .A 1350 ASL A ;MULT BY TWO 1360 TAX ;USE AS INDEX 1370 LDA NEWADR+1,X ;PUT ADDRESS 1380 PHA ;OF NEW ROUTINE 1390 LDA NEWADR,X ;ON STACK. 1400 PHA 1410 JMP CHRGET ;NEXT BYTE & RTS 1420 ; 1430 WEXIT JSR CHR(null)T ;GET BYTE AGAIN 1440 JMP $A7ED ;GIVE IT TO BASIC 1450 ; 1460 TOKEN .BYTE $00 1470 TOKTAB .BYTE $8C,$89,$8D,$9B,$92,$93,$94,$95,$00 1480 NEWADR .WORD RESTOR-1,GOTO-1,GOSUB-1,LIST-1,WAIT-1,LOAD-1,SAVE-1,VERIFY-1 1490 ; 1500 ;RESTORE X,Y -- ALL PARMS OPTIONAL 1510 ; 1520 ADR = $5F ;ADDRESS OF LINE 1530 CHRGET = $0073 ;GET NEXT BYTE 1540 CHR(null)T = $0079 ;GET LAST BYTE 1550 CHKCOM = $AEFD ;CHECK ON COMMA 1560 GETIN = $FFE4 ;SAME AS BASIC GET 1570 GETBYT = $B79E ;GET BYTE INTO .X 1580 FRMNUM = $AD8A ;GET NUMERIC PARM 1590 FACINT = $B7F7 ;CHANGE FAC TO INT 1600 FINADR = $A613 ;FIND ADR OF LINE 1610 UNDEF = $A8E3 ;UNDEF'ED STATMENT 1620 QUOTE = $22 ;ASCII FOR QUOTE 1630 DATA = $83 ;TOKEN FOR DATA 1640 ; 1650 RESTOR = * ;NEW RESTORE CMD 1660 BNE *+5 ;ANY PARMSPRINT 1670 JMP $A81D ;NO/USE ROM ROUTINE 1680 JSR GETPRM ;YES/GET LINE & ADR 1690 LDA ADR ;ADDRESS LO 1700 LDY ADR+1 ;ADDRESS HI 1710 SEC 1720 SBC #$01 ;SUBTRACT 1 1730 BCS *+3 ;DECR HI BYTEPRINT 1740 DEY 1750 STA $41 ;DATA POINTER LO 1760 STY $42 ;DATA POINTER HI 1770 JSR CHR(null)T ;ANOTHER PARMPRINT 1780 BEQ RDONE ;NO/WE'RE DONE 1790 ; 1800 JSR CHKCOM ;YES/CHECK COMMA 1810 JSR GETBYT ;GET BYTE INTO .X 1820 TXA 1830 BEQ RDONE ;0'TH ELEMENTPRINTPRINTPRINT 1840 DEX 1850 BEQ RDONE ;1'ST ELEMENT/DONE 1860 LDY #$04 ;.Y IS TEXT INDEX 1870 LDA ($41),Y ;GET BYTE OF TEXT 1880 CMP #DATA ;DATA STATEMENT? 1890 BNE FINDAT ;NO/FIND IT 1900 ; 1910 LOOP INY ;COMMA SEARCH LOOP 1920 LDA ($41),Y ;GET BYTE FROM LINE 1930 BEQ NOTFND ;END OF LINE 1940 CMP #':' ;COLONPRINT 1950 BEQ NOTFND ;END OF DATA STMNT 1960 CMP #QUOTE ;QUOTEPRINT 1970 BEQ FINQTE ;FIND CLOSING QUOTE 1980 CMP #',' ;COMMAPRINT 1990 BNE LOOP ;NO/TRY AGAIN 2000 DEX ;FOUND ONE! 2010 BNE LOOP ;NEED .X MORE 2020 ; 2030 TYA ;PUT OFFSET IN .A 2040 CLC ;UPDATE THE DATA 2050 ADC $41 ;POINTERS 2060 STA $41 2070 BCC *+4 2080 INC $42 2090 RDONE RTS 2100 ; 2110 FINDAT LDA #DATA ;TOKEN FOR DATA 2120 .BYTE $2C ;SKIP NEXT INSTR. 2130 ; 2140 FINQTE LDA #QUOTE ;TOKEN FOR QUOTE 2150 STA $FB ;SAVE BYTE TO FIND 2160 ; 2170 BLOOP = * ;FIND BYTE AT $FB 2180 INY 2190 LDA ($41),Y ;GET BYTE OF TEXT 2200 BEQ NOTFND ;END OF LINE 2210 CMP $FB ;FOUND ITPRINT 2220 BEQ LOOP ;YES/GOTO MAIN LOOP 2230 BNE BLOOP ;NO/KEEP LOOKING 2240 ; 2250 NOTFND = * ;PRINT MESG & DIE 2260 LDA #MSG 2280 JMP $A469 ;OUTPUT ERR MESG 2290 ; 2300 GETPRM = * ;GET PARM & CHECK IT 2310 JSR FRMNUM ;GET PARM IN FAC 2320 JSR FACINT ;CONVERT TO INT. 2330 JSR FINADR ;GET ADR OF LINE 2340 BCS FOUND ;LINE FOUNDPRINT 2350 JMP UNDEF ;NO/UNDEF'ED LINE 2360 FOUND RTS 2370 ; 2380 MSG .BYTE 'DATA ELEMENT NOT FOUND' 2390 EOM .BYTE $00 2400 ; 2410 ;GOTO -- COMPUTED GOTO STATEMENT 2420 ; 2430 GOTO JSR FRMNUM ;GET PARM IN FAC 2440 JSR FACINT ;CONVERT TO INTEGER 2450 JMP $A8A3 ;THAT'S ALL FOLKS! 2460 ; 2470 ;GOSUB - COMPUTED GOSUB STATEMENT 2480 ; 2490 GOSUB LDA #$03 ;HALF # OF BYTES 2500 JSR $A3FB ;ENOUGH STACK SPACEPRINT 2510 LDA $7B ;TEXT POINTER HI 2520 PHA 2530 LDA $7A ;TEXT POINTER LO 2540 PHA 2550 LDA $3A ;LINE NUMBER HI 2560 PHA 2570 LDA $39 ;LINE NUMBER LO 2580 PHA 2590 LDA #$8D ;TOKEN FOR GOSUB 2600 PHA ;AS I.D. ON STACK 2610 JSR GOTO ;DO A GOTO 2620 JMP $A7AE ;INTERPRETER LOOP 2630 ; 2640 ;LIST - A LIST SUBROUTINE 2650 ; 2660 IERROR = $0300 ;ERROR VECTOR 2670 OLDERR = $E38B ;OLD VECTOR 2680 ; 2690 LIST LDX $3A ;DIRECT MODEPRINT 2700 INX ;SET FLAGS 2710 BNE *+5 ;NO/USE OUR ROUTINE 2720 JMP $A69C ;YES/USE OLD ONE 2730 LDA #RETURN ;ADDRESS FOR LIST 2760 STA IERROR+1 2770 JSR CHR(null)T ;GET BYTE AGAIN 2780 JSR $A69C ;REAL LIST CMD 2790 ; 2800 RETURN LDA #OLDERR ;NORMAL. 2830 STA IERROR+1 2840 RTS 2850 ; 2860 ;WAIT -- PAUSE UNTIL KEY PRESSED 2870 ; 2880 WAIT BEQ *+5 ;ANY PARMSPRINT 2890 JMP $B82D ;YES/USE OLD WAIT 2900 WLOOP JSR GETIN ;GET CHARACTER 2910 BEQ WLOOP ;BUFFER EMPTYPRINT 2920 STA $02 ;SAVE CHARACTER 2930 RTS 2940 ; 2950 ;LOAD/SAVE -- ALL PARMS OPTIONAL 2960 ; 2970 SETNAM = $FFBD ;SET NAME PARAMETER 2980 SETLFS = $FFBA ;SET FILE PARAMETER 2990 ; 3000 VERIFY LDA #$01 ;VERIFY FLAG 3010 .BYTE $2C ;SKIP NEXT INSTR. 3020 LOAD LDA #$00 ;FLAG FOR LOAD 3030 STA $0A ;STORE SYSTEM FLAG 3040 LDA #$00 ;ACT LIKE LOAD NOW 3050 .BYTE $2C ;SKIP NEXT INSTR. 3060 SAVE LDA #$01 ;FLAG FOR SAVE 3070 STA LSFLAG ;STORE OUR FLAG 3080 LDA #$00 ;DEFAULT LENGTH 3090 JSR SETNAM ;SET DEFAULT NAME 3100 LDX #$08 ;DEFAULT DEVICE# 3110 JSR $E1DB ;GET ANY PARMS 3120 LDA $B7 ;LENGTH OF NAME 3130 BEQ NONAME ;NO NAME SPECIFIED 3140 ; 3150 STA LEN ;STORE NEW NAME 3160 TAY ;USE .Y AS INDEX 3170 LDA #$00 ;END NAME WITH 0 3180 STA NAME,Y 3190 ; 3200 NLOOP DEY ;COPY NEW FILENAME 3210 LDA ($BB),Y ;GET BYTE OF NAME 3220 STA NAME,Y ;SAVE IT 3230 BNE NLOOP ;KEEP IT UP 3240 BEQ EXIT ;CONTINUE COMMAND 3250 ; 3260 NONAME = * ;NO NAME SPECIFIED 3270 LDA LEN ;IS NAME DEFINEDPRINT 3280 BEQ EXIT ;NO/ERROR COMING UP 3290 LDA LSFLAG ;LOAD OR SAVEPRINT 3300 BEQ SETUP ;LOAD/FINISH UP 3310 ; 3320 LDA NAME ;SET UP TWO CHAR 3330 STA ABR ;ABBREVIATION OF 3340 LDA NAME+1 ;FILENAME FOR 3350 STA ABR+1 ;EASY BACKUP 3360 ; 3370 JSR SCRACH ;SCRATCH OLD BACKUP 3380 JSR RENAME ;CREATE BACKUP COPY 3390 ; 3400 SETUP LDA LEN ;GET PARAMETERS 3410 LDX #NAME ;LOAD OR SAVE 3430 JSR SETNAM ;SET PARAMETERS 3440 ; 3450 EXIT LDA LSFLAG ;LOAD OR SAVEPRINT 3460 BNE SAVE2 ;SAVE COMMANDPRINT 3470 JMP $E16F ;CONTINUE LOAD CMD 3480 ; 3490 SAVE2 LDX $2D ;END ADR OF SAVE 3500 LDY $2E ;I.E. START OF VARS 3510 LDA #$2B ;POINT TO START ADR 3520 JSR $FFD8 ;CONTINUE SAVE CMD 3530 BCC *+5 ;NORMAL TERMINATION 3540 JMP $E0F9 ;NO/"BREAK" ERROR 3550 RTS 3560 ; 3570 SCRACH = * ;SCRATCH BACKUP 3580 LDA #'S' ;'S' FOR SCRATCH 3590 STA CMD ;SET COMMAND 3600 LDA #$00 ;END OF BUFFER 3610 STA EQUAL ;NO EQUAL SIGN 3620 JMP SEND ;SEND DOS COMMAND 3630 ; 3640 RENAME = * ;RENAME OLD FILE 3650 LDA #'R' ;'R' FOR RENAME 3660 STA CMD ;SET COMMAND 3670 LDA #'=' ;EQUAL SIGN 3680 STA EQUAL ;WHERE ELSEPRINT 3690 JMP SEND ;SEND DOS COMMAND 3700 ; 3710 ; 3720 ;SEND -- THIS ROUTINE CAN BE USED 3730 ;TO SEND ANY DOS COMMAND TO DRIVE 3740 ;BE SURE TO END COMMAND WITH ZERO 3750 ; 3760 CIOUT = $FFA8 ;SEND SERIAL PORT 3770 LISTEN = $FFB1 ;TELL DRIVE LISTEN 3780 SECOND = $FF93 ;SEND 2ND ADR LSTN 3790 UNLSTN = $FFAE ;QUIT LISTENING 3800 ; 3810 SEND LDA #$08 ;DEVICE NUMBER 3820 STA $BA ;STORE FOR SYSTEM 3830 JSR LISTEN ;LISTEN TO COMMAND 3840 LDA #$6F ;CH # OR'ED W/$60 3850 STA $B9 ;SECONDARY ADR 3860 JSR SECOND ;SEND IT TO DRIVE 3870 ; 3880 LDX #$00 ;USE .X AS INDEX 3890 DLOOP LDA CMD,X ;GET BYTE OF CMD 3900 BEQ EXIT1 ;0 BYTE MARKS END 3910 JSR CIOUT ;OUTPUT TO DRIVE 3920 INX ;BUMP POINTER 3930 BNE DLOOP ;JMP TO DLOOP 3940 ; 3950 EXIT1 JMP UNLSTN ;ALL DONE! 3960 ; 3970 LEN .BYTE $00 3980 CMD .BYTE 'S0:' 3990 ABR .BYTE $00,$00,'.BAK' 4000 EQUAL .BYTE $00 4010 NAME * = *+16 4020 LSFLAG .BYTE $00 4030 .END